package com.xjk.ftp;

import java.util.Properties;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;

/**
 * SFTP连接工具类; 默认连接超时时间3分钟，默认端口22 暂时只支持用户名和密码连接。
 */
public class SftpConnectUtil{

    private static Logger log = LoggerFactory.getLogger(SftpConnectUtil.class);

    private Session session = null;

    private Channel channel = null;

    public ChannelSftp getChannel(SftpConfig sftpConfig) throws JSchException{

        JSch jsch = new JSch(); // 创建JSch对象

        session = jsch.getSession(sftpConfig.getUserName(), sftpConfig.getServerName(), sftpConfig.getPort()); // 根据用户名，主机ip，端口获取一个Session对象
        log.debug("Session created.");
        session.setPassword(sftpConfig.getPassword()); // 设置密码
        Properties config = new Properties();
        config.put("StrictHostKeyChecking", "no");
        session.setConfig(config); // 为Session对象设置properties
        session.setTimeout(sftpConfig.getTimeOut()); // 设置timeout时间
        session.connect(); // 通过Session建立链接
        log.debug("Session connected.");

        log.debug("Opening Channel.");
        channel = session.openChannel("sftp"); // 打开SFTP通道
        channel.connect(); // 建立SFTP通道的连接
        // 连接成功，跳出循环
        log.info("Connected successfully to ftpHost = " + sftpConfig.getServerName() + ",as ftpUserName = " + sftpConfig.getUserName() + ", returning: " + channel);
        return (ChannelSftp) channel;

    }

    /**
     * 获取sftp连接带重连机制
     */
    public ChannelSftp getChannelOfRetry(SftpConfig sftpConfig) throws JSchException{
        ChannelSftp sftp = null;
        for (int i = 1; i <= sftpConfig.getRetry(); i++){
            try{
                sftp = getChannel(sftpConfig);// 获取 sftp连接
                break;// 无异常表示获取了正常的连接，由直接跳出循环返回
            }catch (JSchException e){
                // 发生异常
                log.error(e.getMessage());
                if (i == sftpConfig.getRetry()){
                    throw e;
                }
                // 如果存在异常，线程休息一下
                try{
                    Thread.sleep(sftpConfig.getRetryTime());
                }catch (InterruptedException e1){}
            }
        }
        return sftp;
    }

    public void closeChannel(){
        if (channel != null){
            channel.disconnect();
        }
        if (session != null){
            session.disconnect();
        }
    }

    /**
     * 连接sftp服务器
     * 
     * @param host 主机
     * @param port 端口
     * @param username 用户名
     * @param password 密码
     */
    public ChannelSftp connect(String host,int port,String username,String password,int timeOut){
        ChannelSftp sftp = null;
        SftpConfig sftpConfig = new SftpConfig();
        sftpConfig.setPassword(password);
        sftpConfig.setServerName(host);
        sftpConfig.setPort(port);
        sftpConfig.setUserName(username);
        sftpConfig.setTimeOut(timeOut);
        try{
            sftp = getChannel(sftpConfig);
        }catch (JSchException e){
            e.printStackTrace();
        }
        return sftp;
    }


}
